
#include "Juego.h"
#include <iostream>
#include <utility>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <assert.h>
using namespace std;


Juego::Juego(){
	puntos.resize(2,0);
	turno = 0;
	turnoCount = 0;
	actual = 0;
	start=0;
	end=0;
}
void Juego::pushMove(int side,int len){
	moves.push_front(make_pair(side,len));
}
void Juego::swapScores(void){
	int aux;
	aux = puntos[0];
	puntos[0] = puntos[1];
	puntos[1] = aux;
}
Juego::Juego(vector<int> *v){
	numeros.resize( v->size() );
	start=0;
	end=v->size();
	
	for(int i=0; i<v->size();i++) numeros[i] = (*v)[i];

	puntos.resize(2,0);
	turno = 0;
	actual = 0;
}
Juego::Juego(const Juego* j){
	numeros = j->numeros;
	puntos = j->puntos;
	turno = j->turno;
	actual = j->actual;
	turnoCount = j->turnoCount;
	moves = j->moves;
	start = j->start;
	end = j->end;
}
Juego& Juego::operator=(Juego &j){
	numeros = j.numeros;
	puntos = j.puntos;
	turno = j.turno;
	actual = j.actual;
	turnoCount = j.turnoCount;
	moves = j.moves;
	start = j.start;
	end = j.end;
}
void Juego::extraer(int i){
	if (i>0){
		assert(end <= numeros.size());
		assert(start <= numeros.size());
		start += i;
	}else{		
		end += i;
		assert(end <= numeros.size());
		assert(end >=0) ;
	}
}
int Juego::sum(int i, int pre){
	// int acum = 0;
	// int length = numeros.size();
	if (i>0){
		return pre+numeros[i-1];
		// for(int j=0; j<i; j++){
		// 	assert(start+j<end);
		// 	acum += numeros[start+j];
		// }
	}else{		
		return pre+numeros[end+i];
		// for(int j=i; j<0; j++){		
		// 	assert(end+j<numeros.size());
		// 	acum += numeros[end+j];
		// }		
	}
	// return acum;
}

void Juego::cambiarJugadorActual(void){
	actual = (actual+1)%2;
}
void Juego::cambiarJugadorActual(int otro){
	actual = otro;
}
void Juego::addPuntos(int p){
	puntos[actual] += p;
}
int Juego::getPuntos(void){
	return puntos[actual];
}
	
int Juego::getPuntosOtro(void){
	return puntos[(actual+1)%2];
}
	
void Juego::pasarTurno(void){
	turno = (turno+1)%2;
}
bool Juego::finalizo(void){
	return start==end;
}
string Juego::generateKey(void){
	string mapkey;
	char buffer[5];
	for(int i=start; i<end; i++){
		sprintf(buffer, "|%d", numeros[i]);
		mapkey.append(buffer);
	}
	return mapkey;
}	

ostream& operator<<(ostream& stdout, Juego &s) {
    char buffer[100];
    //sprintf(buffer, "A:%d T:%d P %d@%d N: |Nr:%d", s.actual,s.turno,s.puntos[0],s.puntos[1],s.turnoCount);
    sprintf(buffer, "%d %d %d\n", s.turnoCount,s.puntos[0],s.puntos[1]);
    stdout << buffer;
 //    for(int i=0; i<s.numeros.size(); i++){
	// sprintf(buffer, "%d,", s.numeros[i]);
	// stdout << buffer;	
 //    }    
    pair <int,int> p ; 
    //stdout << "moves "<< s.moves.size() ;	    
    while(!s.moves.empty()){
    	p =  s.moves.front();
    	if (p.first == 0){
	    sprintf(buffer, "izq %d\n", p.second);
    	}else{
	    sprintf(buffer, "der %d\n", p.second);
    	}
	s.moves.pop_front();
	stdout << buffer;	
    }
//    stdout << "\n";
    return stdout;
}
